package org.az.netty_study.p01_nio组件之buffer;


import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * buffer必须搭配channel使用
 * bytebuffer的正确使用姿势：
 *  1.向buffer写入数据，例如channel.read(buffer)
 *  2.调用flip()切换到读模式
 *  3.从buffer读取数据，例如buffer.get()
 *  4.调用clear()或compact()切换到写模式
 *  5.重复1~4，直至buffer.get()返回-1，表示读取完毕
 */
@Slf4j
public class _2_buffer和channel初体验 {

    public static void main(String[] args) throws IOException {
        //通过文件输入流FileInputStream获取FileChannel
        FileInputStream fis = new FileInputStream("src/main/resources/data.txt");
        FileChannel channel = fis.getChannel();

        //2.准备缓冲区，容量为10个字节
        ByteBuffer buffer = ByteBuffer.allocate(10);

        //3.从channel读取数据，将数据写入buffer，返回值为读取到的字节数，-1表示没有内容了
        int read;
        while ((read = channel.read(buffer)) != -1) {
            log.info("读取到字节数字{}", read);
            //4.获取buffer的内容
            buffer.flip();  //切换到buffer的读模式
            while (buffer.hasRemaining()) { //hasRemaining(检查是否还有剩余的未读数据)
                byte b = buffer.get();
                log.info("读取到字节{}", (char)b);
            }
            //5.一次读取完毕后，下一次读取时要切换成写模式
            buffer.clear();
        }

        //关闭
        channel.close();
        fis.close();
    }
}
